package com.bang.daybreak.common.util;

import org.apache.commons.collections.ListUtils;

import java.lang.reflect.Field;
import java.util.*;

/**
 * <p>
 *     ListUtil
 * </p>
 *
 * @author wangdejian
 * @since 2017/8/3.
 */
public class ListUtil extends ListUtils {

    public static <E> boolean isEmpty(List<E> list)
    {
        if (null == list || list.size() == 0) {
            return true;
        }
        return false;
    }

    public static <E> boolean isNotEmpty(List<E> list)
    {
        return !isEmpty(list);
    }

    public static <E> List<E> emptyList()
    {
        return new ArrayList(0);
    }

    public static String listToStr(List<String> ll)
    {
        StringBuilder stringBuilder = new StringBuilder();
        if (isEmpty(ll)) {
            return stringBuilder.toString();
        }
        for (int i = 0; i < ll.size(); i++) {
            stringBuilder.append("'");
            stringBuilder.append(ll.get(i));
            if (i == ll.size() - 1) {
                stringBuilder.append("'");
            } else {
                stringBuilder.append("',");
            }
        }
        return stringBuilder.toString();
    }

    public static String attrToStr(String[] attr)
    {
        StringBuilder stringBuilder = new StringBuilder();
        if ((attr == null) || (attr.length == 0)) {
            return stringBuilder.toString();
        }
        for (int i = 0; i < attr.length; i++) {
            stringBuilder.append("'");
            stringBuilder.append(attr[i]);
            if (i == attr.length - 1) {
                stringBuilder.append("'");
            } else {
                stringBuilder.append("',");
            }
        }
        return stringBuilder.toString();
    }

    public static List removeDuplicate(List list)
    {
        HashSet hs = new HashSet(list);
        list.clear();
        list.addAll(hs);
        return list;
    }

    /**
     * 移除list集合中重复数据
     *
     * @param list 集合
     * @return 去重
     */
    public static<T> List removeRepeat(List<T> list) {
        Set set = new  HashSet();
        List newList = new  ArrayList();
        for (T t:list) {
            if(set.add(t)){
                newList.add(t);
            }
        }
        return newList;
    }
    public static String listToString(List<String> ll)
    {
        StringBuilder stringBuilder = new StringBuilder();
        if (isEmpty(ll)) {
            return stringBuilder.toString();
        }
        for (int i = 0; i < ll.size(); i++) {
            if (i == ll.size() - 1) {
                stringBuilder.append(ll.get(i));
            } else {
                stringBuilder.append(ll.get(i) + ",");
            }
        }
        return stringBuilder.toString();
    }

    /**
     * 移除map中的value空值
     * @param map
     */
    public static void removeNullValue(Map map){
        Set set = map.keySet();
        for (Iterator iterator = set.iterator(); iterator.hasNext();) {
            Object obj = (Object) iterator.next();
            Object value =(Object)map.get(obj);
            remove(value, iterator);
        }
    }
    /**
     * 移除map中的空值
     *
     * Iterator 是工作在一个独立的线程中，并且拥有一个 mutex 锁。
     * Iterator 被创建之后会建立一个指向原来对象的单链索引表，当原来的对象数量发生变化时，这个索引表的内容不会同步改变，
     * 所以当索引指针往后移动的时候就找不到要迭代的对象，所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
     * 所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。
     * 但你可以使用 Iterator 本身的方法 remove() 来删除对象， Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
     * @param obj
     * @param iterator
     */
    private static void remove(Object obj,Iterator iterator){
        if(obj instanceof String){
            String str = (String)obj;
            if(StringUtil.isEmpty(str)){  //过滤掉为null和""的值 主函数输出结果map：{2=BB, 1=AA, 5=CC, 8=  }
//            if("".equals(str.trim())){  //过滤掉为null、""和" "的值 主函数输出结果map：{2=BB, 1=AA, 5=CC}
                iterator.remove();
            }

        }else if(obj instanceof Collection){
            Collection col = (Collection)obj;
            if(col==null||col.isEmpty()){
                iterator.remove();
            }

        }else if(obj instanceof Map){
            Map temp = (Map)obj;
            if(temp==null||temp.isEmpty()){
                iterator.remove();
            }

        }else if(obj instanceof Object[]){
            Object[] array =(Object[])obj;
            if(array==null||array.length<=0){
                iterator.remove();
            }
        }else{
            if(obj==null){
                iterator.remove();
            }
        }
    }

    /**
     * 将list中对象的两个属性批量转换至map中（支持字符串属性）
     * @param list
     * @param listProp
     * @param <T>
     * @return
     */
    public static <T> Map<String, String> listPropToStrMap(List<T> list, String[] listProp) {
        Map<String, String> map = new HashMap<String, String>();
        String fieldOne = listProp[0]; // 属性名称1
        String fieldTwo = listProp[1]; // 属性名称2
        Class clazz = list.get(0).getClass();
        try {
            Field field1 = clazz.getDeclaredField(fieldOne);
            Field field2 = clazz.getDeclaredField(fieldTwo);
            field1.setAccessible(true);
            field2.setAccessible(true);
            for (T t : list) {
                map.put(field1.get(t) + "", field2.get(t) + "");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

    /**
     * 获取list中存放的最后一个元素
     * @param list
     * @param <T>
     * @return
     */
    public static <T> T getLastElement(List<T> list) {
        return list.get(list.size() - 1);
    }

}
